home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / etc / hotplug / usb.rc < prev    next >
Text File  |  2006-05-01  |  13KB  |  392 lines

  1. #!/bin/sh
  2. # vim: syntax=sh
  3. #
  4. # usb.rc    This brings the USB subsystem up and down safely.
  5. #
  6. # $Id: usb.rc,v 1.28 2004/09/20 22:30:35 kroah Exp $
  7. #
  8. # Best invoked via /etc/init.d/hotplug or equivalent, with
  9. # writable /tmp, /usr mounted, and syslogging active.
  10. #
  11. # Bus management is basically unrelated to runlevel changes; it
  12. # relates to physical topology, including possibly hotpluggable
  13. # busses (USB, Cardbus) or controllers.  If a bus is physically
  14. # present, it should normally be available.
  15. # USB-dependant systems (iMacs, "legacy free" x86 systems, and so on)
  16. # should statically link USB keyboard support into the kernel (USB core,
  17. # EHCI/OHCI/UHCI/..., hid, input, keybdev; and likely mousedev) so the
  18. # system console can't be removed by accident.
  19.  
  20.  
  21. PATH=/sbin:/bin:/usr/sbin:/usr/bin
  22.  
  23. unset I_WANT_A_BROKEN_PS
  24. PS_PERSONALITY=linux
  25.  
  26. STATIC_MODULE_LIST=
  27. X11_USBMICE_HACK=false
  28.  
  29. # override any of the defaults above?
  30. if [ -f /etc/sysconfig/usb ]; then
  31.     . /etc/sysconfig/usb
  32. fi
  33. if [ -f /etc/conf.d/usb ]; then
  34.     . /etc/conf.d/usb
  35. fi
  36.  
  37.  
  38. MOUSE_MODULES="mousedev input"
  39.  
  40. # In its currently-recommended configuration, XFree86 3.3.6 always opens
  41. # /dev/input/mice; so mousedev and input must be loaded before X11 starts.
  42. if [ $X11_USBMICE_HACK = true ]; then
  43.     STATIC_MODULE_LIST="$MOUSE_MODULES $STATIC_MODULE_LIST"
  44. fi
  45.  
  46.  
  47. #
  48. # "COLD PLUG" ... recovery from partial USB init that may have happened
  49. # before the OS could really handle hotplug, perhaps because /sbin or
  50. # $HOTPLUG_DIR wasn't available or /tmp wasn't writable.  When/if the
  51. # /sbin/hotplug program is invoked then, hotplug event notifications
  52. # get dropped.  To make up for such "cold boot" errors, we synthesize
  53. # all the hotplug events we expect to have seen already.  They can be
  54. # out of order, and some might be duplicates.
  55. #
  56. # Note that on 2.5 the init filesystem may have loaded some of the more
  57. # essential usb drivers (maybe usb-storage for a boot disk, and hid),
  58. # but we may still need to load less important ones or invoke setup
  59. # scripts that couldn't run earlier.
  60. #
  61. usb_boot_events ()
  62. {
  63.     #
  64.     # FIXME on 2.5, /sys/bus/usb/devices/* gives all of the
  65.     # info we need.  Interface hotplug events come from the
  66.     # "*:*" files, and device events (do them first) come
  67.     # from the others. 
  68.     #
  69.     # don't expect usbmodules to exist!!  and remove the
  70.     # dependency (below) on usbfs to decide whether we should
  71.     # be synthesizing coldplug events.
  72.     #
  73.  
  74.     # synthesize hotplug events if we can 
  75.  
  76.     # make sure the usb agent will run
  77.     ACTION=add
  78.     PRODUCT=0/0/0
  79.     TYPE=
  80.     INTERFACE=
  81.     DEVPATH=
  82.     DEVFS=/proc/bus/usb
  83.     DEVICE=
  84.     export ACTION PRODUCT TYPE INTERFACE DEVPATH DEVFS DEVICE
  85.  
  86.     if [ -d /sys/bus ]; then
  87.         if [ -d /sys/bus/usb/devices ]; then
  88.         cd /sys/bus/usb/devices
  89.         for device in /sys/bus/usb/devices/[0-9]*; do
  90.             devlink=$( readlink -f $device )
  91.             DEVPATH=${devlink#/sys}
  92.             if [ -f $devlink/../idVendor ]; then
  93.             PRODUCT="$(cat $devlink/../idVendor)/$(cat $devlink/../idProduct)/$(cat $devlink/../bcdDevice)"
  94.                 if [ -f $devlink/../../devnum ]
  95.             then
  96.                 devbus=$( ( echo -n 000 ; cat $devlink/../../devnum ) | grep -o ...\$ )
  97.                 devdev=$( ( echo -n 000 ; cat $devlink/../devnum ) | grep -o ...\$ )
  98.                 DEVICE="/proc/bus/usb/$devbus/$devdev"
  99.             else
  100.                 DEVICE=
  101.             fi
  102.             /etc/hotplug/usb.agent
  103.             fi    
  104.         done
  105.         fi
  106.     else
  107.         # we need (non-bash) programs to parse descriptors.
  108.         LISTER=`which usbmodules`
  109.         if [ "$LISTER" = "" ] || [ ! -f /proc/bus/usb/devices ]; then
  110.         echo $"** can't synthesize root hub events"
  111.         return
  112.         fi
  113.         for DEVICE in /proc/bus/usb/*/*; do
  114.         /etc/hotplug/usb.agent
  115.         done
  116.     fi
  117. }
  118.  
  119.  
  120. maybe_start_usb ()
  121. {
  122.     COUNT=0
  123.  
  124.     # if USB is partially initted then synthesize "cold plug" events. the
  125.     # kernel probably dropped many "hot plug" events, and those it didn't
  126.     # drop likely couldn't trigger all the setup actions (kicking daemons,
  127.     # dropping config records, and so on).
  128.  
  129.     # if it's not initted at all (no hcds loaded) no synthesized events
  130.     # will be needed, we'll see real ones.  knowing that there are no
  131.     # hcds available through version-portable logic is a nightmare, so
  132.     # assume we synthesize unless "usbfs" is clearly not initted (which
  133.     # we currently need when synthesizing, anyway).
  134.  
  135.     SYNTHESIZE=true
  136.     if [ ! -d /proc/bus/usb ]; then
  137.     SYNTHESIZE=false
  138.     fi
  139.  
  140.     # if distro hasn't already done part of this ... load core,
  141.     # and mount usbfs before the first hotplug agent fires
  142.     # (so it'll be available to the agents).
  143.     modprobe -q usbcore >/dev/null 2>&1
  144.     if [ -d /proc/bus/usb ]; then
  145.     # if it's not mounted, try to mount it
  146.     if [ -z "`grep " /proc/bus/usb " /proc/mounts`" ]; then
  147.         if grep -q -E "^[^#][^[:space:]]+[[:space:]]+/proc/bus/usb/?[[:space:]]" /etc/fstab; then
  148.         mount /proc/bus/usb
  149.         else
  150.         if grep -q usbfs /proc/filesystems; then
  151.             mount -t usbfs usbfs /proc/bus/usb
  152.         else
  153.             mount -t usbdevfs usbdevfs /proc/bus/usb
  154.         fi
  155.         fi
  156.     fi
  157.     fi
  158.  
  159.     # Load Host Controller Drivers (HCDs) ... this automatically handles
  160.     # systems with multiple controllers (EHCI, OHCI, UHCI) without needing
  161.     # /proc or tools (lspci -v|grep USB, etc) to do so.  If hotplugging
  162.     # is enabled on this system, initting a root hub will cause hotplug
  163.     # events to fire for every device on the tree at that root.
  164.  
  165.     # FIXME: some of this should be driven by PCI hotplugging, and have
  166.     # the blacklist control which uhci driver gets used (before 2.5).
  167.  
  168.     # "new style" HCDs ... more common code
  169.     modprobe -q ehci-hcd >/dev/null 2>&1
  170.     modprobe -q ohci-hcd >/dev/null 2>&1
  171.     modprobe -q uhci-hcd >/dev/null 2>&1
  172.  
  173.     # "old style" HCDs ... more driver-specific bugs
  174.     modprobe -q usb-ohci >/dev/null 2>&1
  175.     # NOTE: this prefers "uhci"; you may prefer "usb-uhci".
  176.     # modprobe -q usb-uhci >/dev/null 2>&1 || modprobe -q uhci >/dev/null 2>&1
  177.     modprobe -q uhci >/dev/null 2>&1 || modprobe -q usb-uhci >/dev/null 2>&1
  178.  
  179.     # ... add any non-PCI HCDS here.  Examples include the
  180.     # CRIS usb-host, Philips ISP-1161, Symlogic 811HS, and so on.
  181.     # ohci-hcd can handle some non-pci variants.
  182.  
  183.     if [ -d /proc/bus/usb ]; then
  184.     # If we see there are no busses, we "failed" and
  185.     # can report so even if we're partially nonmodular.
  186.     #
  187.     # NOTE: this fails on older kernels, where usbdevfs had two files
  188.     # ('devices' and 'drivers') with no hcds registered, but works on
  189.     # newer kernels where usbfs has zero files until hcds register,
  190.     # and might not have the 'drivers' file.
  191.     COUNT=`ls /proc/bus/usb | wc -l`
  192.     if [ $COUNT -lt 2 ]; then
  193.         umount /proc/bus/usb
  194.         rmmod usbcore >/dev/null 2>&1
  195.         return 1
  196.     fi
  197.  
  198.     # if USB is fully modular and yet can clean up,
  199.     # we know init failed without needing usbfs
  200.     elif rmmod usbcore >/dev/null 2>&1; then
  201.     return 1
  202.     fi
  203.  
  204.     # hotplug events didn't fire during booting;
  205.     # cope with devices that enumerated earlier
  206.     # and may not have been fully configured.
  207.     if [ $SYNTHESIZE = true ]; then
  208.     sleep 1
  209.         usb_boot_events
  210.     fi
  211.  
  212.     # Some modules are statically loaded, perhaps because they are
  213.     # needed to activate filesystem device nodes.
  214.     for MODULE in $STATIC_MODULE_LIST; do
  215.     modprobe $MODULE
  216.     done
  217.  
  218.     # we did everything we could ...
  219.     return 0
  220. }
  221.  
  222. maybe_stop_usb ()
  223. {
  224.     # call this multiple times if you had to take down components of the
  225.     # USB subsystem by hand; it cleans up whatever can
  226.     # be cleaned up, letting the system quiesce further.
  227.  
  228.     # NOTE:  this list of "all USB modules" is unfortunate, but it seems
  229.     # inevitable until modutils supports the notion of drivers with use
  230.     # counts of zero that shouldn't be removed until after their device
  231.     # gets removed.  Maybe in 2.5 ... of necessity, the list is partial.
  232.  
  233.     # disconnect all controllers we can, and kernel drivers
  234.     # HCDs first, so most drivers reduce their use counts.
  235.     rmmod ehci-hcd >/dev/null 2>&1
  236.     rmmod ohci-hcd >/dev/null 2>&1
  237.     rmmod uhci-hcd >/dev/null 2>&1
  238.     rmmod usb-ohci >/dev/null 2>&1
  239.     rmmod usb-uhci >/dev/null 2>&1
  240.     rmmod     uhci >/dev/null 2>&1
  241.  
  242.     # user mode code may keep usbfs busy for a while yet ...
  243.  
  244.     # OK, usbcore won't actually be removed unless there happen to be
  245.     # no USB drivers loaded, and usbfs isn't mounted.  let's force
  246.     # removal of autocleanable modules before trying to rmmod usbcore
  247.     rmmod -as
  248. # note: module-init-tools 0.8a doesn't handle "-as" flags
  249.  
  250.     # Now let's workaround the fact that some USB modules never increase
  251.     # their module use counts, so that "rmmod -a" won't unload them.
  252.     # (And we can't use "modprobe --autoclean" anyway.)
  253.     rmmod acm              >/dev/null 2>&1
  254.     rmmod audio            >/dev/null 2>&1
  255.     rmmod auerswald        >/dev/null 2>&1
  256.     rmmod belkin_sa        >/dev/null 2>&1
  257.     rmmod bluetooth        >/dev/null 2>&1
  258.     rmmod catc             >/dev/null 2>&1
  259.     rmmod CDCEther         >/dev/null 2>&1
  260.     rmmod cpia_usb         >/dev/null 2>&1
  261.     rmmod cyberjack        >/dev/null 2>&1
  262.     rmmod dabusb           >/dev/null 2>&1
  263.     rmmod dc2xx            >/dev/null 2>&1
  264.     rmmod digi_acceleport  >/dev/null 2>&1
  265.     rmmod dsbr100          >/dev/null 2>&1
  266.     rmmod emi26            >/dev/null 2>&1
  267.     rmmod empeg            >/dev/null 2>&1
  268.     rmmod ftdi_sio         >/dev/null 2>&1
  269.     rmmod hci_usb          >/dev/null 2>&1
  270.     rmmod hid              >/dev/null 2>&1
  271.     rmmod hpusbscsi        >/dev/null 2>&1
  272.     rmmod ibmcam           >/dev/null 2>&1
  273.     rmmod iforce           >/dev/null 2>&1
  274.     rmmod io_edgeport      >/dev/null 2>&1
  275.     rmmod ipaq             >/dev/null 2>&1
  276.     rmmod ir-usb           >/dev/null 2>&1
  277.     rmmod irda-usb         >/dev/null 2>&1
  278.     rmmod kaweth           >/dev/null 2>&1
  279.     rmmod keyspan          >/dev/null 2>&1
  280.     rmmod keyspan_pda      >/dev/null 2>&1
  281.     rmmod kl5kusb105       >/dev/null 2>&1
  282.     rmmod mct_u232         >/dev/null 2>&1
  283.     rmmod mdc800           >/dev/null 2>&1
  284.     rmmod microtek         >/dev/null 2>&1
  285.     rmmod omninet          >/dev/null 2>&1
  286.     rmmod ov511            >/dev/null 2>&1
  287.     rmmod pegasus          >/dev/null 2>&1
  288.     rmmod pl2303           >/dev/null 2>&1
  289.     rmmod printer          >/dev/null 2>&1
  290.     rmmod pwc pwcx         >/dev/null 2>&1
  291.     rmmod rio500           >/dev/null 2>&1
  292.     rmmod rtl8150          >/dev/null 2>&1
  293.     rmmod scanner          >/dev/null 2>&1
  294.     rmmod se401            >/dev/null 2>&1
  295.     rmmod stv680           >/dev/null 2>&1
  296.     rmmod usbhid           >/dev/null 2>&1
  297.     rmmod usbkbd           >/dev/null 2>&1
  298.     rmmod usbmouse         >/dev/null 2>&1
  299.     rmmod usbnet           >/dev/null 2>&1
  300.     rmmod usbtest          >/dev/null 2>&1
  301.     rmmod usb-storage      >/dev/null 2>&1
  302.     rmmod uss720           >/dev/null 2>&1
  303.     rmmod vicam            >/dev/null 2>&1
  304.     rmmod visor            >/dev/null 2>&1
  305.     rmmod wacom            >/dev/null 2>&1
  306.     rmmod whiteheat        >/dev/null 2>&1
  307.  
  308.     if [ "$STATIC_MODULE_LIST" != "" ]; then
  309.     rmmod $STATIC_MODULE_LIST >/dev/null 2>&1
  310.     fi
  311.  
  312.     # remove the helper modules that some usb modules need
  313.     rmmod usbserial        >/dev/null 2>&1
  314.     rmmod usbvideo         >/dev/null 2>&1
  315.  
  316.     # ok, hope that user mode drivers/managers closed their fds.
  317.     umount /proc/bus/usb >/dev/null 2>&1
  318.  
  319.     rmmod usbcore >/dev/null 2>&1
  320.  
  321.     # we did everything we could ...
  322.     return 0;
  323. }
  324.  
  325. # See how we were called.
  326. case "$1" in
  327.   start)
  328.     maybe_start_usb
  329.         ;;
  330.   stop)
  331.     maybe_stop_usb
  332.         ;;
  333.   status)
  334.     echo $"USB Status for kernel: " `uname -srm`
  335.     echo ''
  336.  
  337.     if [ -f /proc/bus/usb/devices ]; then
  338.         # as noted above:  this fails on older kernels,
  339.         # where usbfs created files differently.
  340.         COUNT=`ls /proc/bus/usb | wc -l`
  341.         if [ $COUNT -ge 2 ]; then
  342.         COUNT=`expr $COUNT - 2`
  343.         echo $"USB up; bus count is $COUNT"
  344.         grep "^[TPSI]:" /proc/bus/usb/devices
  345.         else
  346.         echo $"usbfs partially up; no busses"
  347.         fi
  348.         echo ''
  349.  
  350.         echo $"USB Drivers Loaded: "
  351.         if [ -f /proc/bus/usb/drivers ]; then
  352.         cat /proc/bus/usb/drivers
  353.         fi
  354.         if [ -d /sys/bus/usb ]; then
  355.         ls -1 /sys/bus/usb/drivers
  356.         fi
  357.     else
  358.         echo $"usbfs is unavailable. "
  359.         if [ -f /proc/modules ] && grep -F -q usbcore /proc/modules; then
  360.         echo $"USB module is loaded. "
  361.         else
  362.         echo $"USB may be statically linked. "
  363.         fi
  364.         echo $"If khubd is running, that shows USB is available."
  365.     fi
  366.     echo ''
  367.  
  368.     if [ -f /proc/sys/kernel/hotplug ]; then
  369.         echo $"khubd/hotplug thread: "
  370.     else
  371.         echo $"khubd thread:"
  372.     fi
  373.     ps -l | head -n 1
  374.     ps -Al | grep 'khubd' | grep -v grep
  375.     echo ''
  376.  
  377.     lsmod
  378.     echo ''
  379.  
  380.     # /proc/devices too? "usb", "input", and others ...
  381.  
  382.     ;;
  383.   restart)
  384.     # always invoke by absolute path, else PATH=$PATH:
  385.     $0 stop && $0 start
  386.     ;;
  387.   *)
  388.         echo $"Usage: $0 {start|stop|status|restart}"
  389.         exit 1
  390. esac
  391.